﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using General;


namespace TVL
{
    public class Objeto
    {
        public Objeto(string ruta)
        {
            _fallo = "No";
            _LPosiciones = new List<Posiciones>();
            this.cargar(ruta);
        }

        public Objeto(XmlElement nodo)
        {
            _fallo = "No";
            _LPosiciones = new List<Posiciones>();
            this.cargar(nodo);
        }

        private const string _rutaxsd = "../../../TVL/TVLClases/Objeto.xsd";
        public Objeto()
        {
            _Nombre = "";
            _Peso = "";
            _Tamanyo = "";
            _Descripcion = "";
            _fallo = "No";
            _Cantidad = 0;
            _LPosiciones = new List<Posiciones>();

        }
        private string _Nombre;
        public string Nombre
        {
             get
            {
                return this._Nombre;
            }
             set
            {
                this._Nombre = value;
            }
        }

        protected string _fallo;
        public string Fallo
        {
            get { return this._fallo; }
        }

        private string _Peso;
        public string Peso
        {
            get
            {
                return this._Peso;
            }
            set
            {
                this._Peso = value;
            }
        }

        private string _Tamanyo;
        public string Tamanyo
        {
            get
            {
                return this._Tamanyo;
            }
            set
            {
                this._Tamanyo = value;
            }
        }

        private string _Descripcion;
        public string Descripcion
        {
            get { return this._Descripcion; }
            set { this._Descripcion = value; }
        }

        private int _Cantidad;
        public int Cantidad
        {
            get { return this._Cantidad; }
            set { this._Cantidad = value; }
        }

        private List<Posiciones> _LPosiciones;
        protected Posiciones toPos(string pos)
        {
            if (pos == "ManoDcha")
            {
                return Posiciones.ManoDcha;
            }

            if (pos == "ManoIzq")
            {
                return Posiciones.ManoIzq;
            }

            if (pos == "Cabeza")
            {
                return Posiciones.Cabeza;
            }

            if (pos == "Camisa")
            {
                return Posiciones.Camisa;
            }

            if (pos == "Pecho")
            {
                return Posiciones.Pecho;
            }

            if (pos == "Capa")
            {
                return Posiciones.Capa;
            }

            if (pos == "AntebrazoIzq")
            {
                return Posiciones.AntebrazoIzq;
            }

            if (pos == "AntebrazoDcha")
            {
                return Posiciones.AntebrazoDcha;
            }

            if (pos == "Piernas")
            {
                return Posiciones.Piernas;
            }

            return Posiciones.Pies;
        }
        public List<Posiciones> LPosiciones
        {
            get
            {
                return this._LPosiciones;
            }
            set
            {
                this._LPosiciones = value;
            }
        }

        public bool CanEquip(Posiciones Sitio)
        {
            bool puede = false;
            for (int i = 0; i < this.LPosiciones.Count; i++)
            {
                if (this.LPosiciones[i] == Sitio)
                {
                    puede = true;
                    break;
                }
            }
            return puede;
        }

        public virtual void toXTVL(XmlTextWriter mixml)
        {
            mixml.WriteStartElement("objeto");
            mixml.WriteElementString("nombre", this.Nombre);
            mixml.WriteElementString("peso", this.Peso.ToString());
            mixml.WriteElementString("tamanyo", this.Tamanyo);
            mixml.WriteElementString("desc", this.Descripcion);
            mixml.WriteElementString("cantidad", this.Cantidad.ToString());
            mixml.WriteStartElement("posiciones");
            for (int i = 0; i < this.LPosiciones.Count; i++)
            {
                mixml.WriteElementString("posicion", this.LPosiciones[i].ToString());
            }
            mixml.WriteEndElement();
            mixml.WriteEndElement();
        }

        public virtual bool guardar(string ruta)
        {
            XmlTextWriter mixml = new XmlTextWriter(ruta, System.Text.Encoding.UTF8);
            mixml.Formatting = System.Xml.Formatting.Indented;
            mixml.WriteStartDocument();
            this.toXTVL(mixml);
            mixml.WriteEndDocument();
            mixml.Close();
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (validador.validar())
            {
                return true;
            }
            else
            {
                if (System.IO.File.Exists(ruta))
                {
                    System.IO.File.Delete(ruta);
                }
                this._fallo = validador.Fallo;
                return false;
            }
        }

        public virtual bool cargar(string ruta)
        {
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if(!validador.validar())
            {
                this._fallo = validador.Fallo;
                return false;
            }
            else
            {
                XmlDocument xtvl = new XmlDocument();
                xtvl.Load(ruta);
                XmlNodeList nombre = xtvl.GetElementsByTagName("nombre");
                XmlNodeList desc = xtvl.GetElementsByTagName("desc");
                XmlNodeList peso = xtvl.GetElementsByTagName("peso");
                XmlNodeList tamanyo = xtvl.GetElementsByTagName("tamanyo");
                XmlNodeList cant = xtvl.GetElementsByTagName("cantidad");
                XmlNodeList pos = xtvl.GetElementsByTagName("posiciones");
                Nombre = nombre[0].InnerText;
                Descripcion = desc[0].InnerText;
                Peso = peso[0].InnerText;
                Tamanyo = tamanyo[0].InnerText;
                Cantidad =Convert.ToInt32(cant[0].InnerText);
                foreach(XmlElement spos in pos)
                {
                    XmlNodeList mipos = spos.GetElementsByTagName("posicion");
                    LPosiciones.Add(this.toPos(mipos[0].InnerText));
                }
                return true;
            }
        }

        public virtual bool cargar(XmlElement nodo)
        {
            try
            {
                XmlNodeList nombre = nodo.GetElementsByTagName("nombre");
                XmlNodeList desc = nodo.GetElementsByTagName("desc");
                XmlNodeList peso = nodo.GetElementsByTagName("peso");
                XmlNodeList tamanyo = nodo.GetElementsByTagName("tamanyo");
                XmlNodeList cant = nodo.GetElementsByTagName("cantidad");
                XmlNodeList pos = nodo.GetElementsByTagName("posiciones");
                Nombre = nombre[0].InnerText;
                Descripcion = desc[0].InnerText;
                Peso = peso[0].InnerText;
                Tamanyo = tamanyo[0].InnerText;
                Cantidad = Convert.ToInt32(cant[0].InnerText);
                foreach (XmlElement spos in pos)
                {
                    XmlNodeList mipos = spos.GetElementsByTagName("posicion");
                    LPosiciones.Add(this.toPos(mipos[0].InnerText));
                }
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

    }
}
